﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MaquinaJMG.GUI.Contrato;
using Datos.Entidades;
using Logica.Comandos.AdministracionUsuarios;
using Datos.Entidades.FabricaEntidades;
using Logica.Comandos;
using Logica.FabricaLogica;
using System.Windows.Forms;
using Logica.Comandos.ComandosAdministracionEvento;
using System.Xml;
using System.Xml.Linq;

namespace MaquinaJMG.GUI.Presentador
{
    public class PresentadorLeerXML
    {
        IContratoLeerXML _variables;
        public PresentadorLeerXML( )
        {
         }

        List<Entidad> usuarios = new List<Entidad>();
        
        public void leer(string ruta)
        {


            XElement xmlContactos = XElement.Load(ruta+"actualizacionEventos.xml");

          
            //Obtener el Nombre y clave de todos los usuarios
            var UsuariosTodos =
            from c in xmlContactos.Descendants("usuario")
            select new { nombre = c.Element("nombreUsuario").Value,
                         clave = c.Element("claveCifrada").Value
            };
            foreach (var item in UsuariosTodos)
            {
                Entidad usuario = FabricaEntidades.ObtenerUsuario();
               
                (usuario as Usuario).Login = item.nombre;
                (usuario as Usuario).ClaveCifrada = item.clave.ToString();
                Comando comandoUsuariovalidar = FabricaComandoUsuario.ObtenerComandoUsuarioLogin();
                comandoUsuariovalidar.Entidad=usuario;
                comandoUsuariovalidar.Ejecutar();

                if (comandoUsuariovalidar.Entidad==null)
                {
                     Comando comandoUsuario = FabricaComandoUsuario.ObtenerComandoInsertarUsuario();
                     comandoUsuario.Entidad = usuario;
                     comandoUsuario.Ejecutar();
                }
               
      
            }
        }
        /// <summary>
        /// Busca los eventos que se encuntran en el xml
        /// </summary>
        

        public void leer2(string ruta){
            XElement xmlContactos = XElement.Load(ruta + "/actualizacionEventos.xml");

            var EventosTodos =
            from c in xmlContactos.Descendants("evento")
            select new 
            {
                idEvento = c.Element("IdEvento").Value,
                nombreEvento = c.Element("nombreEvento").Value,
                estatusEvento = c.Element("estatusEvento").Value,
                cantidadTabla = c.Element("CantidadTabla").Value,
                IdCategoria = c.Element("IdCategoria").Value,
                nombreCategoria = c.Element("nombreCategoria").Value,
                tipoCategoria = c.Element("tipoCategoria").Value,
                estatusCategoria = c.Element("estatusCategoria").Value,
                fechaInicio = c.Element("fechaInicio").Value,
                fechaFin = c.Element("fechaFin").Value,
                hora = c.Element("hora").Value,
                minuto = c.Element("minuto").Value,
                participantes=from d in c.Elements("participante")
                select 
                new
                {
                    idHistoria = d.Element("idHistoriaParticipante").Value,
                    posicion = d.Element("posicion").Value,
                    puntos = d.Element("puntos").Value,
                    relacionPago = d.Element("relacionPago").Value,
                    idParticipante = d.Element("idParticipante").Value,
                    estatusParticipante = d.Element("estatusParticipante").Value,
                    nombreParticipante = d.Element("nombreParticipante").Value,
                    topeApuesta = d.Element("topeApuesta").Value
                }
            };
            foreach (var item in EventosTodos)
            {
                Entidad elEvento = FabricaEntidades.ObtenerEventoCategoria();
                (elEvento as EventoCategoria).Id_Evento = int.Parse(item.idEvento);
                (elEvento as EventoCategoria).NombreEvento = item.nombreEvento;
                (elEvento as EventoCategoria).Estatus = int.Parse(item.estatusEvento);
                (elEvento as EventoCategoria).Posiciones=int.Parse(item.cantidadTabla);
                (elEvento as EventoCategoria).FK_Id_Categoria = int.Parse(item.IdCategoria);
                (elEvento as EventoCategoria).NombreCategoria = item.nombreCategoria;
                (elEvento as EventoCategoria).TipoCategoria = int.Parse(item.tipoCategoria);
                (elEvento as EventoCategoria).EstatusCategoria= int.Parse(item.estatusCategoria);
                (elEvento as EventoCategoria).Fecha_Inicio = item.fechaInicio;
                (elEvento as EventoCategoria).Fecha_Fin = item.fechaFin;
                (elEvento as EventoCategoria).Hora = int.Parse(item.hora);
                (elEvento as EventoCategoria).Minuto = int.Parse(item.minuto);

                validarInsertsEventoCat(elEvento);
                foreach (var item2 in item.participantes)
                {
                    Entidad elHistorial = FabricaEntidades.ObtenerHistorialParticipante();
                    (elHistorial as HistorialParticipante).IdParticipante1=int.Parse(item2.idHistoria);
                    (elHistorial as HistorialParticipante).Posicion=int.Parse(item2.posicion);
                    (elHistorial as HistorialParticipante).Puntos = int.Parse(item2.puntos);
                    (elHistorial as HistorialParticipante).RelacionPago = int.Parse(item2.relacionPago);
                    (elHistorial as HistorialParticipante).IdEvento1=int.Parse(item2.idParticipante);
                    (elHistorial as HistorialParticipante).Tipocate = int.Parse(item2.estatusParticipante);
                    (elHistorial as HistorialParticipante).NombreParticipante1 = item2.nombreParticipante;
                    (elHistorial as HistorialParticipante).TopeApuesta1 = int.Parse(item2.topeApuesta);
                    validarInsertsEventoCat(elEvento, elHistorial);
        
                }
                
            }
        }
        /// <summary>
        /// valida los inserts de participantes
        /// </summary>
        /// <param name="eventoCat">evento al que pertenece el participante</param>
        /// 
        /// <param name="participante">participante a insertar</param>


        public void validarInsertsEventoCat(Entidad eventoCat, Entidad participante)
        {
            Comando comando = FabricaComandoParticipante.CrearComandoBuscarParticipante((participante as HistorialParticipante).IdEvento1);
            comando.Ejecutar();
            if ((comando.Entidad as Participante).IdParticipante == 0)
            {
                Entidad elParticipante = FabricaEntidades.ObtenerParticipante();
                (elParticipante as Participante).IdParticipante = (participante as HistorialParticipante).IdEvento1;
                (elParticipante as Participante).NombreParticipante = (participante as HistorialParticipante).NombreParticipante1;
                (elParticipante as Participante).Categoria = (eventoCat as EventoCategoria).FK_Id_Categoria;
                comando = FabricaComandoParticipante.CrearComandoCrearParticipante(elParticipante);
                comando.Ejecutar();
                if (!comando.Flag)
                    Console.WriteLine("No se ha podido crear el participante!");
                else
                    Console.WriteLine("El Participante fue creado con éxito!");
            }
            Comando comandoHistorial = FabricaComandoEvento.ObtenerComandoBuscarEventoParticipante23();
            comandoHistorial.Id = (participante as HistorialParticipante).IdParticipante1;
            comandoHistorial.Ejecutar();
            if ((comandoHistorial.ListaEntidad).Count== 0)
            {
                Entidad evento = FabricaEntidades.ObtenerEvento();
                ((evento as Evento).Id_Evento)=(participante as HistorialParticipante).IdParticipante1;
                ((evento as Evento).Fecha_Inicio)=(eventoCat as EventoCategoria).Fecha_Inicio;
                ((evento as Evento).Fecha_Fin)=(eventoCat as EventoCategoria).Fecha_Fin;
                ((evento as Evento).Hora)=(eventoCat as EventoCategoria).Hora;
                ((evento as Evento).Minuto)=(eventoCat as EventoCategoria).Minuto;
                ((evento as Evento).TopeApuesta)=(participante as HistorialParticipante).TopeApuesta1;
                ((evento as Evento).RelacionPago)=(participante as HistorialParticipante).RelacionPago;
                ((evento as Evento).FK_Id_Evento) = (eventoCat as EventoCategoria).Id_Evento;
                ((evento as Evento).FK_Id_Participante)=(participante as HistorialParticipante).IdEvento1;
                comando = FabricaComandoEvento.ObtenerComandoInsertarHistorialParticipante();
                comando.Entidad = evento;
                comando.Ejecutar();
                if (!comando.Flag)
                    Console.WriteLine("No se ha podido crear la categoria!");
                else
                    Console.WriteLine("La categoria fue creado con éxito!");
            }
        }




        /// <summary>
        /// valida los inserts de eventoCategoria
        /// </summary>
        /// <param name="eventoCat">evento a insertar</param>


        public void validarInsertsEventoCat(Entidad eventoCat)
        {
            Comando comando = FabricaComandoCategoria.CrearComandoBuscarCategoria((eventoCat as EventoCategoria).FK_Id_Categoria);
            comando.Ejecutar();
            Entidad resultad = comando.Entidad;
            if ((resultad as Categoria).Id_Categoria == 0)
            {
                Entidad categoria = FabricaEntidades.ObtenerCategoria();
                (categoria as Categoria).Id_Categoria = (eventoCat as EventoCategoria).FK_Id_Categoria;
                (categoria as Categoria).NombreCategoria = (eventoCat as EventoCategoria).NombreCategoria;
                (categoria as Categoria).TipoCategoria = (eventoCat as EventoCategoria).TipoCategoria;
                (categoria as Categoria).Status = (eventoCat as EventoCategoria).EstatusCategoria;
                Comando comando1 = FabricaComandoCategoria.CrearComandoCrearCategoria(categoria);
                comando1.Ejecutar();
                if (!comando1.Flag)
                    Console.WriteLine("No se ha podido crear la categoria!");
                else
                    Console.WriteLine("La categoria fue creado con éxito!");
            }
            Comando comandoEvento = FabricaComandoEvento.ObtenerComandoBuscarEvento();
            int existe=0;
            comandoEvento.Ejecutar();
            for (int i = 0; i < comandoEvento.ListaEntidad.Count; i++) 
            {
                if ((comandoEvento.ListaEntidad.ElementAt(i) as Evento).Id_Evento == (eventoCat as EventoCategoria).Id_Evento)
                    existe = 1;
            }
            if (existe==0)
            {
                Entidad evento = FabricaEntidades.ObtenerEvento();
                (evento as Evento).Id_Evento = (eventoCat as EventoCategoria).Id_Evento;
                (evento as Evento).NombreEvento = (eventoCat as EventoCategoria).NombreEvento;
                (evento as Evento).FK_Id_Categoria = (eventoCat as EventoCategoria).FK_Id_Categoria;
                (evento as Evento).Posiciones = (eventoCat as EventoCategoria).Posiciones;
                comando = FabricaComandoEvento.ObtenerComandoInsertarEvento();
                comando.Entidad = evento;
                comando.Ejecutar();
                if (!comando.Flag)
                    Console.WriteLine("No se ha podido crear el evento!");
                else
                    Console.WriteLine("El Evento fue creado con éxito!");
            }
            
            
        }
    }
}

  



    